---
id: sensitive-detection
title: 30. 脱敏处理
sidebar_label: 30. 脱敏处理
---

:::important 版本说明

以下内容仅限 `Furion 2.4.4 +` 版本使用。

:::

import useBaseUrl from "@docusaurus/useBaseUrl";

## 30.1 关于脱敏

引用百度百科：

> 数据脱敏是指对某些敏感信息通过脱敏规则进行数据的变形，实现敏感隐私数据的可靠保护。在涉及客户安全数据或者一些商业性敏感数据的情况下，在不违反系统规则条件下，对真实数据进行改造并提供测试使用，如身份证号、手机号、卡号、客户号等个人信息都需要进行数据脱敏。数据安全技术之一，数据库安全技术主要包括：数据库漏扫、数据库加密、数据库防火墙、数据脱敏、数据库安全审计系统。

在 `Furion` 系统中，`脱敏处理` 指的是对不符合系统合法词汇检测验证。

## 30.2 如何使用

`Furion` 框架内置了一套默认的脱敏词汇脱敏处理机制，并且提供自定义操作。

### 30.2.1 注册 `脱敏词汇检测` 服务

```cs {3}
public void ConfigureServices(IServiceCollection services)
{
    services.AddSensitiveDetection();
}
```

### 30.2.2 创建 `sensitive-words.txt` 文件

在 `Web` 启动层项目中创建 `sensitive-words.txt` 文件，**确保采用 `UTF-8` 编码格式且设置为嵌入式资源！**🎃

`sensitive-words.txt` 内容格式为每一行标识一个脱敏词汇：

```
坏人
无语
滚开
八嘎
```

接下来设置为嵌入式资源：

<img src={useBaseUrl("img/tm.png")} />

### 30.2.3 使用脱敏检测

- **实现数据验证脱敏检测 `[SensitiveDetection]`**

`Furion` 框架提供了 `[SensitiveDetection]` 验证特性，可以对参数、属性进行脱敏验证，用法和 `[DataValidation]` 一致，如：

```cs {4,9}
// 在属性中使用
public class Content
{
    [SensitiveDetection]
    public string Text { get; set; }
}

// 在 动态API/Controller 中使用
public void Test([SensitiveDetection] string text)
{

}
```

- **通过 `ISensitiveDetectionProvider` 服务使用**

`Furion` 框架也提供了 `ISensitiveDetectionProvider` 服务进行手动脱敏验证处理，如：

```cs {4,15,25,35}
public class FurionService
{
    private readonly ISensitiveDetectionProvider _sensitiveDetectionProvider;
    public FurionService(ISensitiveDetectionProvider sensitiveDetectionProvider)
    {
        _sensitiveDetectionProvider = sensitiveDetectionProvider;
    }

    /// <summary>
    /// 获取所有脱敏词汇
    /// </summary>
    /// <returns></returns>
    public async Task<IEnumerable<string>> GetWordsAsync()
    {
        return await _sensitiveDetectionProvider.GetWordsAsync();
    }

    /// <summary>
    /// 判断是否是正常的词汇
    /// </summary>
    /// <param name="text"></param>
    /// <returns></returns>
    public async Task<bool> VaildedAsync(string text)
    {
        return await _sensitiveDetectionProvider.VaildedAsync(text);
    }

    /// <summary>
    /// 替换非正常词汇
    /// </summary>
    /// <param name="text"></param>
    /// <returns></returns>
    public async Task<string> ReplaceAsync(string text)
    {
        return await _sensitiveDetectionProvider.ReplaceAsync(text, '*');
    }
}
```

### 30.2.3 脱敏词汇替换

`Furion` 框架也提供了替换脱敏词汇的特性支持，如：

```cs {4}
// 在属性中使用
public class Content
{
    [SensitiveDetection('*')]
    public string Text { get; set; }
}
```

:::caution 特别注意

`Furion` 框架目前只提供类中使用替换特性支持，但未提供方法单个值替换支持，如**以下代码不受支持**：

```cs {1}
public void Test([SensitiveDetection('*')] string text)
{
}
```

:::

## 30.3 自定义脱敏词汇处理

`Furion` 框架除了内置了一套默认的 `脱敏处理` 程序，也支持自定义脱敏处理程序。

### 30.3.1 自定义 `ISensitiveDetectionProvider` 程序，如：

```cs {4,15,25,36}
/// <summary>
/// 自定义脱敏词汇检测器
/// </summary>
public class YourSensitiveDetectionProvider : ISensitiveDetectionProvider
{
    // 支持构造函数注入
    public YourSensitiveDetectionProvider()
    {
    }

    /// <summary>
    /// 返回所有脱敏词汇
    /// </summary>
    /// <returns></returns>
    public async Task<IEnumerable<string>> GetWordsAsync()
    {
        // 这里写你脱敏词汇数据的来源（如从数据库读取），建议做好缓存操作
    }

    /// <summary>
    /// 判断脱敏词汇是否有效
    /// </summary>
    /// <param name="text"></param>
    /// <returns></returns>
    public async Task<bool> VaildedAsync(string text)
    {
        // 这里写你如何判断是正常的字符，返回 true 正常，返回 false 表示是个脱敏词汇
    }

    /// <summary>
    /// 替换脱敏词汇
    /// </summary>
    /// <param name="text"></param>
    /// <param name="transfer"></param>
    /// <returns></returns>
    public async Task<string> ReplaceAsync(string text, char transfer = '*')
    {
        // 这里写你替换非正常字符为指定字符
    }
}
```

### 30.3.2 注册自定义脱敏提供器

```cs {3}
public void ConfigureServices(IServiceCollection services)
{
    services.AddSensitiveDetection<YourSensitiveDetectionProvider>();
}
```

之后系统将自动采用自定义的方式进行脱敏处理。

## 30.4 反馈与建议

:::note 与我们交流

给 Furion 提 [Issue](https://gitee.com/dotnetchina/Furion/issues/new?issue)。

:::

---
